package com.sccdlg.es;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sccdlg.es.pojo.Article;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Before;
import org.junit.Test;

import java.net.InetAddress;

/**
 * @author RaoShuang
 * @emil 991207823@qq.com
 * @date 2020/9/16 21:50
 * 测试ES客户端（Java访问连接向）
 * es版本：7.4.2
 */
public class ElasticSearchclientTest {
    /** 客户端Client对象 */
    private TransportClient client;

    @Before
    public void init() throws Exception {
        //1、创建一个Settings对象，相当于是一个配置信息。主要配置集群的名称。
        Settings settings = Settings.builder()
                .put("cluster.name", "my-elasticsearch")
                .build();
        client = new PreBuiltTransportClient(settings)
        .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.235.129"),9300));
    }

    /**
     * 创建索引库
     */
    @Test
    public void createIndex() throws Exception {
        //1、创建一个Settings对象，相当于是一个配置信息。主要配置集群的名称。
        Settings settings = Settings.builder()
                .put("cluster.name", "my-elasticsearch")
                .build();
        //2、创建一个客户端Client对象
        TransportClient client = new PreBuiltTransportClient(settings);
        //2-1、单机版设置一个ip+端口就可，集群添加所有；
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.235.129"),9300));
        //3、使用client对象创建一个索引库
        client.admin().indices().prepareCreate("index_hello")
                //3-1、执行操作
                .get();
        //4、关闭client对象
        client.close();
    }

    /**
     * 设置mappings
     */
    @Test
    public void setMappings() throws Exception {
        //1、创建一个Settings对象
        Settings settings = Settings.builder()
                .put("cluster.name", "my-elasticsearch")
                .build();
        //2、创建一个TransportClient对象
        TransportClient client = new PreBuiltTransportClient(settings);
        //2-1、单机版设置一个ip+端口就可，集群添加所有；
        client.addTransportAddress(new TransportAddress(
                InetAddress.getByName("192.168.235.129"),9300));
        //3、创建一个mappings
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                    .startObject("article")
                        .startObject("properties")
                            .startObject("id")
                                .field("type","long")
                                .field("store",true)
                            .endObject()
                            .startObject("title")
                                .field("type","text")
                                .field("store",true)
                                .field("analyzer","ik_smart")
                            .endObject()
                            .startObject("content")
                                .field("type","text")
                                .field("store",true)
                                .field("analyzer","ik_smart")
                            .endObject()
                        .endObject()
                    .endObject()
                .endObject();
        //4、使用client把mapping信息设置到索引库中
        client.admin().indices()
                //设置要做映射的索引
                .preparePutMapping("index_hello")
                //设置要做映射的type
                .setType("article")
                //mapping信息，可以是XContentBuilder对象，也可以是json格式的字符串
                .setSource(builder)
                //执行操作
                .get();
        //5、关闭client对象
        client.close();
    }

    /**
     * 添加文档
     */
    @Test
    public void testAddDocument() throws Exception {
        //1、创建一个Client对象
        //2、创建一个文档对象，创建一个json格式的字符串，或者使用XContentBuilder
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                    .field("id",3L)
                    .field("title","北方入秋速度明显加快,多地降温幅度最多可达10度333")
                    .field("content","南方入秋潮湿多雨,气温逐渐降低,但出太阳时气温回升333")
                .endObject();
        //3、使用client对象吧文档添加到索引库中
        client.prepareIndex()
                //设置索引名称
                .setIndex("index_hello")
                //设置tpye类型
                .setType("article")
                //设置文档id，如果不设置ES会自动生成一个随机字符串id
                .setId("3")
                //添加文档内容
                .setSource(builder)
                //执行操作
                .get();
        //4、关闭client
        client.close();
    }

    /**
     * 添加文档第二种方式
     */
    @Test
    public void testAddDocument2() throws Exception {
        //创建一个Article对象
        Article article = new Article();
        //设置对象的属性
        article.setId(4L);
        article.setTitle("美国禁令生效");
        article.setContent("由于美国的实体清单，于2020年9月15日开始，禁止向华为在内的中国高科技企业输送芯片技术");
        //把article对象转换为json格式的字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonDocument = objectMapper.writeValueAsString(article);
        System.out.println(jsonDocument);
        //使用client对象吧文档添加到索引库中
        client.prepareIndex("index_hello","article","4")
                .setSource(jsonDocument, XContentType.JSON).get();
        //关闭客户端
        client.close();
    }

    /**
     * 批量添加文档信息
     * @throws Exception
     */
    @Test
    public void testAddDocument3() throws Exception {
        for (int i = 4; i < 100; i++) {
            //创建一个Article对象
            Article article = new Article();
            //设置对象的属性
            article.setId(i);
            article.setTitle("习近平会见联合国秘书长--" + i);
            article.setContent("央视网消息：国家主席习近平18日晚在北京以视频方式会见联合国秘书长古特雷斯--" + i);
            //把article对象转换为json格式的字符串
            ObjectMapper objectMapper = new ObjectMapper();
            String jsonDocument = objectMapper.writeValueAsString(article);
            System.out.println(jsonDocument);
            //使用client对象吧文档添加到索引库中
            client.prepareIndex("index_hello","article",String.valueOf(i))
                    .setSource(jsonDocument, XContentType.JSON).get();
        }
        //关闭客户端
        client.close();
    }
}
